import configparser
import os
import chardet


class ConfigManager:
    """配置文件管理器"""

    def __init__(self, file_path):
        """
        初始化 ConfigManager 类实例。

        :param file_path: 配置文件的路径。
        """
        self.file_path = file_path
        self._create_file_if_not_exists(self.file_path)
        self.config = configparser.ConfigParser()
        self._load_config()

    def _create_file_if_not_exists(self, file_path):
        """
        如果配置文件不存在，则创建一个新的配置文件。

        :param file_path: 配置文件的路径。
        """
        if not os.path.exists(file_path):
            with open(self.file_path, 'w', encoding="utf-8", errors='ignore') as f:
                f.write('[DEFAULT]')

    def _load_config(self):
        """
        从配置文件中加载配置信息。
        """
        encoding = self.detect_encoding(self.file_path)
        print(f"配置文件: {self.file_path}\n编码: {encoding}")
        with open(self.file_path, "r", encoding=encoding, errors='ignore') as f:
            self.config.read_file(f)

    def get_key(self, k):
        """
        根据给定的键名获取配置值。

        :param k: 要获取的配置键名。
        :return: 键名对应的配置值，如果键名不存在，则返回 None。
        """
        if k in self.config["DEFAULT"]:
            return self.config["DEFAULT"][k]
        else:
            return None

    def set_key(self, k, v):
        """
        设置配置键值对。

        :param k: 要设置的配置键名。
        :param v: 要设置的配置值。
        """
        self.config["DEFAULT"][k] = v
        with open(self.file_path, 'w', encoding="utf-8", errors='ignore') as configfile:
            self.config.write(configfile)

    @staticmethod
    def detect_encoding(file_path):
        with open(file_path, 'rb') as f:
            rawdata = f.read()
        return chardet.detect(rawdata)['encoding']
